home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / lpmac1.arc / MACROS.MLB < prev    next >
Text File  |  1987-03-02  |  13KB  |  1,044 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.     .XCREF    SET_MACRO_EXPANSION
  16. SET_MACRO_EXPANSION    MACRO
  17.  IFNDEF    MACRO_EXPANSION_CONTROL
  18.     .XALL
  19.     ENDIF
  20.     IFDEF    MACRO_EXPANSION_CONTROL
  21.     IF MACRO_EXPANSION_CONTROL EQ 1
  22.     .SALL
  23.     ELSE
  24.     IF    MACRO_EXPANSION_CONTROL EQ 2
  25.     .LALL
  26.     ENDIF
  27.     ENDIF
  28.     ENDIF
  29.     ENDM
  30.  
  31.  
  32.     IFNDEF    TRUE
  33. TRUE    EQU    001H
  34.     ENDIF
  35.     IFNDEF    ZFLAG
  36. ZFLAG    EQU    00040H
  37.     ENDIF
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.     .XCREF    REGISTER_TO_SERIAL_FOR_LIST
  48. REGISTER_TO_SERIAL_FOR_LIST    MACRO    REGISTER, SERIAL, LIST
  49.     .XCREF    SERIAL_LIST_ITEM
  50. SERIAL_LIST_ITEM    =    0
  51. SERIAL    =    0
  52.     IRP    REGISTER_LIST_ITEM, <LIST>
  53. SERIAL_LIST_ITEM    =    SERIAL_LIST_ITEM + 1
  54.  
  55.     IFIDN    <REGISTER>, <REGISTER_LIST_ITEM>
  56. SERIAL    =    SERIAL_LIST_ITEM
  57.     EXITM
  58.     ENDIF
  59.     ENDM
  60.     ENDM
  61.  
  62.  
  63.  
  64.     .XCREF    REGISTER_TO_SERIAL
  65. REGISTER_TO_SERIAL    MACRO    REGISTER, SERIAL
  66.     REGISTER_TO_SERIAL_FOR_LIST    REGISTER, SERIAL, <AX,BX,CX,DX,SI,DI,SP,BP,DS,ES,SS>
  67.     IFE    SERIAL
  68.     REGISTER_TO_SERIAL_FOR_LIST    REGISTER, SERIAL, <ax,bx,cx,dx,si,di,sp,bp,ds,es,ss>
  69.     ENDIF
  70.     ENDM
  71.  
  72.  
  73.  
  74.  
  75.     .XCREF SERIAL_TO_POP_REGISTER
  76. SERIAL_TO_POP_REGISTER    MACRO    SERIAL
  77.     .XCREF    UNMATCHED_SERIAL_TO_POP_REGISTER, SERIAL_LIST_ITEM
  78. SERIAL_LIST_ITEM    =    0
  79. UNMATCHED_SERIAL_TO_POP_REGISTER    =    1
  80.  
  81.     IRP    REGISTER_LIST_ITEM, <AX,BX,CX,DX,SI,DI,SP,BP,DS,ES,SS>
  82. SERIAL_LIST_ITEM    =    SERIAL_LIST_ITEM + 1
  83.     IF    SERIAL EQ SERIAL_LIST_ITEM
  84.     POP    REGISTER_LIST_ITEM
  85. UNMATCHED_SERIAL_TO_POP_REGISTER    =    0
  86.  
  87.     EXITM
  88.     ENDIF
  89.     ENDM
  90.     IF    UNMATCHED_SERIAL_TO_POP_REGISTER
  91.     ERROR, BAD SPEC FOR SERIAL_TO_POP_REGISTER
  92.     ENDIF
  93.     ENDM
  94.  
  95.     .XCREF    PHASE_1_REGISTER_STACK_INIT, PHASE_2_REGISTER_STACK_INIT
  96. PHASE_1_REGISTER_STACK_INIT    =    1
  97. PHASE_2_REGISTER_STACK_INIT    =    1
  98.  
  99.  
  100.     .XCREF    REGISTER_STACK_INIT_IF_NECESSARY
  101. REGISTER_STACK_INIT_IF_NECESSARY    MACRO
  102.     .XCREF    REGISTER_STACK_TOP
  103.     IF1
  104.     IF PHASE_1_REGISTER_STACK_INIT
  105. REGISTER_STACK_TOP    =    0
  106. PHASE_1_REGISTER_STACK_INIT    =    0
  107.     ENDIF
  108.     ENDIF
  109.     IF2
  110.     IF PHASE_2_REGISTER_STACK_INIT
  111. REGISTER_STACK_TOP    =    0
  112. PHASE_2_REGISTER_STACK_INIT    =    0
  113.     ENDIF
  114.     ENDIF
  115.     ENDM
  116.  
  117.  
  118.  
  119.  
  120.  
  121.     .XCREF    SAVE_REGISTER_STACK
  122. SAVE_REGISTER_STACK    MACRO    RS_TOP, VALUE
  123.     .XCREF    REGISTER_STACK&RS_TOP
  124. REGISTER_STACK&RS_TOP    =    VALUE
  125.     ENDM
  126.  
  127.  
  128.  
  129.     .XCREF    PUSH_REGISTER_STACK
  130. PUSH_REGISTER_STACK    MACRO    REGISTER_STACK_VALUE
  131.     REGISTER_STACK_INIT_IF_NECESSARY
  132. REGISTER_STACK_TOP    = REGISTER_STACK_TOP + 1
  133.     SAVE_REGISTER_STACK    %REGISTER_STACK_TOP, REGISTER_STACK_VALUE
  134.     ENDM
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.     .XCREF    PUSH_REGISTER_SERIAL
  143. PUSH_REGISTER_SERIAL    MACRO    REGISTR, REGISTER_SERIAL
  144.     REGISTER_TO_SERIAL    REGISTR, REGISTER_SERIAL
  145.  
  146.  
  147.     IF    REGISTER_SERIAL
  148.     PUSH    REGISTR
  149.     PUSH_REGISTER_STACK    %REGISTER_SERIAL
  150.     ELSE
  151.     ERROR, UNABLE TO PUSH REGISTER REGISTR
  152.  
  153.     ENDIF
  154.     ENDM
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.     .XCREF    REGISTER_STACK_TO_POP_REGISTER
  162. REGISTER_STACK_TO_POP_REGISTER    MACRO    RS_TOP
  163.     SERIAL_TO_POP_REGISTER    %(REGISTER_STACK&RS_TOP)
  164.     ENDM
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.     .XCREF    POP_REGISTER_STACK
  172. POP_REGISTER_STACK    MACRO
  173.     IF    REGISTER_STACK_TOP
  174.     REGISTER_STACK_TO_POP_REGISTER    %REGISTER_STACK_TOP
  175. REGISTER_STACK_TOP    =    REGISTER_STACK_TOP - 1
  176.  
  177.     ELSE
  178.     ERROR, UNABLE TO POP THE EMPTY REGISTER STACK    
  179.     ENDIF
  180.     ENDM
  181.  
  182.     .XCREF    PUSH_REGISTERS,POP_REGISTERS
  183.  
  184.  
  185.  
  186.  
  187. PUSH_REGISTERS    MACRO    REGS
  188.  
  189.  
  190.     .XCREF    REGISTER_STACK_COUNT, REGISTER_SERIAL
  191. REGISTER_STACK_COUNT    =    0
  192.  
  193.  
  194.  
  195.     IRP    REG,<REGS>
  196.     PUSH_REGISTER_SERIAL    REG, REGISTER_SERIAL
  197.  
  198.  
  199.  
  200.     IF    REGISTER_SERIAL
  201. REGISTER_STACK_COUNT    =    REGISTER_STACK_COUNT + 1
  202.     ENDIF
  203.     ENDM
  204.     PUSH_REGISTER_STACK    %REGISTER_STACK_COUNT
  205.     ENDM
  206.  
  207.  
  208.  
  209.  
  210.     .XCREF    POP_REGISTER_STACK_COUNT
  211. POP_REGISTER_STACK_COUNT    MACRO    RS_TOP
  212. REGISTER_STACK_COUNT    =    REGISTER_STACK&RS_TOP
  213. REGISTER_STACK_TOP    =    REGISTER_STACK_TOP - 1
  214.     ENDM
  215.  
  216.  
  217.  
  218.  
  219. POP_REGISTERS    MACRO
  220.     REGISTER_STACK_INIT_IF_NECESSARY
  221.     IF    REGISTER_STACK_TOP
  222.  
  223.     POP_REGISTER_STACK_COUNT    %REGISTER_STACK_TOP
  224.  
  225.  
  226.     IF    REGISTER_STACK_COUNT
  227.     REPT    REGISTER_STACK_COUNT
  228.     POP_REGISTER_STACK
  229.  
  230.     ENDM
  231.     ENDIF
  232.     ELSE
  233.  
  234.     ERROR, NO REGISTERS LEFT TO POP
  235.     ENDIF
  236.     ENDM
  237.  
  238.  
  239.  
  240.  
  241.     .XCREF    PUSHM,POPM
  242.  
  243. PUSHM    MACRO    REGS
  244.     IRP    REG,<REGS>
  245.     PUSH    REG
  246.     ENDM
  247.     ENDM
  248.  
  249. POPM    MACRO    REGS
  250.     IRP    REG,<REGS>
  251.     POP    REG
  252.     ENDM
  253.     ENDM
  254.  
  255.     .XCREF    GETZ,GETNZ,NOTZ
  256.  
  257.  
  258.  
  259. GETZ    MACRO
  260.     LOCAL    SKIPZ
  261.     MOV    AL,TRUE
  262.     JZ    SKIPZ
  263.     XOR    AL,AL
  264. SKIPZ:
  265.     AND    AL,AL
  266.     ENDM
  267.  
  268.  
  269.  
  270. GETNZ    MACRO
  271.     LOCAL    SKIPNZ
  272.     MOV    AL,TRUE
  273.     JNZ    SKIPNZ
  274.     XOR    AL,AL
  275. SKIPNZ:
  276.     ENDM
  277.  
  278.  
  279.  
  280. NOTZ    MACRO
  281.     LAHF
  282.     AND    AH,ZFLAG
  283.     ENDM
  284.  
  285.     .XCREF    JNNC,JNNZ,JNNNZ,JNNE,JNNNE,JNNS,JU,JNU,JNNCXZ
  286.  
  287.  
  288.  
  289. JNNC    MACRO    LABEL
  290.     JC    LABEL
  291.     ENDM
  292.  
  293. JNNZ    MACRO    LABEL
  294.     JZ    LABEL
  295.     ENDM
  296.  
  297. JNNNZ    MACRO    LABEL
  298.     JNZ    LABEL
  299.     ENDM
  300.  
  301. JNNE    MACRO    LABEL
  302.     JE    LABEL
  303.     ENDM
  304.  
  305. JNNNE    MACRO    LABEL
  306.     JNE    LABEL
  307.     ENDM
  308.  
  309. JNNS    MACRO    LABEL
  310.     JS    LABEL
  311.     ENDM
  312.  
  313. JU    MACRO    LABEL
  314.     JMP    SHORT LABEL
  315.     ENDM
  316.  
  317. JNU    MACRO    LABEL
  318.     ENDM
  319.  
  320. JNNCXZ    MACRO    LABEL
  321.     JCXZ    LABEL
  322.     ENDM
  323.  
  324.     .XCREF    JNNB,JNNA
  325. JNNB    MACRO    LABEL
  326.     JB    LABEL
  327.     ENDM
  328.  
  329. JNNA    MACRO    LABEL
  330.     JA    LABEL
  331.     ENDM
  332.  
  333.  
  334.  
  335.  
  336.     .XCREF    JNNBE, JNNLE, JNNL, JNNGE, JNNG, JNNO, JNNP, JNPO, JNPE
  337.  
  338. JNNBE    MACRO    LABEL
  339.     JBE    LABEL
  340.     ENDM
  341.  
  342. JNNLE    MACRO    LABEL
  343.     JLE    LABEL
  344.     ENDM
  345.  
  346. JNNL    MACRO    LABEL
  347.     JL    LABEL
  348.     ENDM
  349.  
  350. JNNGE    MACRO    LABEL
  351.     JGE    LABEL
  352.     ENDM
  353.  
  354. JNNG    MACRO    LABEL
  355.     JG    LABEL
  356.     ENDM
  357. JNNO    MACRO    LABEL
  358.     JO    LABEL
  359.     ENDM
  360.  
  361. JNNP    MACRO    LABEL
  362.     JP    LABEL
  363.     ENDM
  364.  
  365. JNPO    MACRO    LABEL
  366.     JPE    LABEL
  367.     ENDM
  368.  
  369. JNPE    MACRO    LABEL
  370.     JPO    LABEL
  371.     ENDM
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.     .XCREF    SET_SHORT_BACK
  383. SET_SHORT_BACK    MACRO    BACK_LABEL
  384.     .XCREF    SHORT_LABEL
  385. SHORT_LABEL    =    $ - OFFSET BACK_LABEL LE 126
  386.     ENDM
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.     .XCREF    SET_SHORT_FORWARD
  394. SET_SHORT_FORWARD    MACRO    FORWARD_LABEL, MAX_BYTES
  395.     .XCREF    FORWARD_SHORT_LABEL
  396.     IF1
  397.  
  398. FORWARD_SHORT_LABEL    =    0
  399.     ENDIF
  400.     IF2
  401.  
  402. FORWARD_SHORT_LABEL    =    OFFSET FORWARD_LABEL - $ LE MAX_BYTES
  403.     ENDIF
  404.     ENDM
  405.  
  406.     IFDEF    LP_DEBUG
  407.     .XCREF    D_SHORT_LABEL
  408. D_SHORT_LABEL    MACRO
  409.     .LALL
  410.     IF    SHORT_LABEL
  411.  
  412.     ELSE
  413.  
  414.     ENDIF
  415.     SET_MACRO_EXPANSION
  416.     ENDM
  417.     ENDIF
  418.  
  419.  
  420.  
  421.  
  422.     .XCREF    IS_LONG_NECESSARY
  423. IS_LONG_NECESSARY    MACRO    FORWARD_LABEL, MAX_BYTES
  424.     .XCREF    UNNECESSARY_LONG_COMMENTS
  425.     SET_SHORT_FORWARD    FORWARD_LABEL, MAX_BYTES
  426.  
  427.  
  428.     IF1
  429.  
  430. UNNECESSARY_LONG_COMMENTS    =    0
  431.  
  432.     ENDIF
  433.     IF    FORWARD_SHORT_LABEL
  434.     .LALL
  435.  
  436.     .SALL
  437.     SET_MACRO_EXPANSION
  438. UNNECESSARY_LONG_COMMENTS    =    1
  439.     ENDIF
  440.     ENDM
  441.  
  442.  
  443.     .XCREF    OUT_UNNECESSARY_LONG_COMMENTS
  444. OUT_UNNECESSARY_LONG_COMMENTS    MACRO
  445.     IFDEF    UNNECESSARY_LONG_COMMENTS
  446.     IF    UNNECESSARY_LONG_COMMENTS
  447.  
  448.     .LALL
  449.  
  450.  
  451.  
  452.     .SALL
  453.     %OUT    *
  454.     %OUT    * There were some LONG jumps which could have been SHORT.
  455.     %OUT    *
  456.     ENDIF
  457.     ENDIF
  458.     ENDM
  459.  
  460.  
  461.  
  462.     .XCREF    SET_BACKWARD_JUMP
  463. SET_BACKWARD_JUMP    MACRO TARGET_LABEL
  464.     .XCREF    BACKWARD_JUMP
  465.     IF1
  466.     IFNDEF    TARGET_LABEL
  467. BACKWARD_JUMP    =    0
  468.     ENDIF
  469.     IFDEF    TARGET_LABEL
  470. BACKWARD_JUMP    =    1
  471.     ENDIF
  472.     ENDIF
  473.     IF2
  474. BACKWARD_JUMP    =    $ - OFFSET TARGET_LABEL GT 0
  475.     ENDIF
  476.     ENDM
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.     .XCREF    LJMP
  484. LJMP    MACRO    TARGET_LABEL, LONG
  485.     LOCAL    BYPASS
  486.     SET_BACKWARD_JUMP TARGET_LABEL
  487.     IF BACKWARD_JUMP
  488.     SET_SHORT_BACK    TARGET_LABEL
  489.     ELSE
  490.     .XCREF    SHORT_LABEL
  491. SHORT_LABEL    =    1
  492.     IFNB    <LONG>
  493.     .XCREF    LJMP_MAX_SHORT
  494. LJMP_MAX_SHORT    =    127 + OFFSET BYPASS - $
  495.     IS_LONG_NECESSARY    TARGET_LABEL, LJMP_MAX_SHORT
  496.  
  497. SHORT_LABEL    =    0
  498.     ENDIF
  499.     ENDIF
  500.     IF    SHORT_LABEL
  501.     JMP    SHORT TARGET_LABEL
  502.     ELSE
  503.     JMP    TARGET_LABEL
  504.     ENDIF
  505.     IFE    BACKWARD_JUMP
  506.     .SALL
  507.     .XCREF    BYPASS
  508. BYPASS:
  509.     SET_MACRO_EXPANSION
  510.     ENDIF
  511.     ENDM
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.     .XCREF    LCJMP
  521. LCJMP    MACRO    CONDITION, TARGET_LABEL, LONG
  522.     LOCAL    BYPASS
  523.     SET_BACKWARD_JUMP TARGET_LABEL
  524.     IF BACKWARD_JUMP
  525.     SET_SHORT_BACK    TARGET_LABEL
  526.     ELSE
  527. SHORT_LABEL    =    1
  528.     IFNB    <LONG>
  529.     .XCREF    LCJMP_MAX_SHORT
  530. LCJMP_MAX_SHORT    =    127 + OFFSET BYPASS - $
  531.     IS_LONG_NECESSARY    TARGET_LABEL, LCJMP_MAX_SHORT
  532.  
  533. SHORT_LABEL    =    0
  534.     ENDIF
  535.     ENDIF
  536.     IF    SHORT_LABEL
  537.     J&CONDITION    TARGET_LABEL
  538.     ELSE
  539.     JN&CONDITION    BYPASS
  540.     JMP    TARGET_LABEL
  541.     ENDIF
  542.     IFE    SHORT_LABEL AND BACKWARD_JUMP
  543.  
  544.     IF    SHORT_LABEL
  545.     .XCREF    BYPASS
  546.     .SALL
  547.     ENDIF
  548. BYPASS:
  549.     IF    SHORT_LABEL
  550.     SET_MACRO_EXPANSION
  551.     ENDIF
  552.     ENDIF
  553.     ENDM
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.     .XCREF    LJCXZ
  561. LJCXZ    MACRO    TARGET_LABEL, LONG
  562.     LOCAL    BYPASS
  563.     SET_BACKWARD_JUMP TARGET_LABEL
  564.     IF BACKWARD_JUMP
  565.     SET_SHORT_BACK    TARGET_LABEL
  566.     ELSE
  567. SHORT_LABEL    =    1
  568.     IFNB    <LONG>
  569.     .XCREF    LJXCZ_MAX_SHORT
  570. LJXCZ_MAX_SHORT    =    127 + OFFSET BYPASS - $
  571.     IS_LONG_NECESSARY    TARGET_LABEL, LJXCZ_MAX_SHORT
  572.  
  573. SHORT_LABEL    =    0
  574.     ENDIF
  575.     ENDIF
  576.     IF    SHORT_LABEL
  577.     JCXZ    TARGET_LABEL
  578.     ELSE
  579.     OR    CX,CX
  580.     JNZ    BYPASS
  581.     JMP    TARGET_LABEL
  582.     ENDIF
  583.     IFE    SHORT_LABEL AND BACKWARD_JUMP
  584.  
  585.     IF    SHORT_LABEL
  586.     .XCREF    BYPASS
  587.     .SALL
  588.     ENDIF
  589. BYPASS:
  590.     IF    SHORT_LABEL
  591.     SET_MACRO_EXPANSION
  592.     ENDIF
  593.     ENDIF
  594.     ENDM
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.     .XCREF    LLOOP
  603. LLOOP    MACRO    CONDITION, TARGET_LABEL, LONG
  604.     LOCAL    BYPASS
  605.     SET_BACKWARD_JUMP TARGET_LABEL
  606.     IF BACKWARD_JUMP
  607.     SET_SHORT_BACK    TARGET_LABEL
  608.     ELSE
  609. SHORT_LABEL    =    1
  610.     IFNB    <LONG>
  611.     .XCREF    LLOOP_MAX_SHORT
  612. LLOOP_MAX_SHORT    EQU    127 + OFFSET BYPASS - $
  613.     IS_LONG_NECESSARY    TARGET_LABEL, LLOOP_MAX_SHORT
  614.  
  615. SHORT_LABEL    =    0
  616.     ENDIF
  617.     ENDIF
  618.     IF    SHORT_LABEL
  619.     LOOP&CONDITION    TARGET_LABEL
  620.     ELSE
  621.     IFNB    <CONDITION>
  622.     JN&CONDITION    BYPASS
  623.     ENDIF
  624.     DEC    CX
  625.     JZ    BYPASS
  626.     JMP    TARGET_LABEL
  627.     ENDIF
  628.     IFE    SHORT_LABEL AND BACKWARD_JUMP
  629.  
  630.     IF    SHORT_LABEL
  631.     .XCREF    BYPASS
  632.     .SALL
  633.     ENDIF
  634. BYPASS:
  635.     IF    SHORT_LABEL
  636.     SET_MACRO_EXPANSION
  637.     ENDIF
  638.     ENDIF
  639.     ENDM
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.     .XCREF    XINIT
  683. XINIT    MACRO    
  684.     .XCREF    L?CNT,S?CNT
  685. L?CNT    =    0
  686. S?CNT    =    0
  687.     ENDM
  688.  
  689.  
  690.     .XCREF    PHASE_1_XINIT, PHASE_2_XINIT, XINIT_IF_NECESSARY
  691. PHASE_1_XINIT    =    1
  692. PHASE_2_XINIT    =    1
  693. XINIT_IF_NECESSARY    MACRO
  694.     IF1
  695.     IF PHASE_1_XINIT
  696.     XINIT
  697. PHASE_1_XINIT    =    0
  698.     ENDIF
  699.     ENDIF
  700.     IF2
  701.     IF PHASE_2_XINIT
  702.     XINIT
  703. PHASE_2_XINIT    =    0
  704.     ENDIF
  705.     ENDIF
  706.     ENDM
  707.  
  708.     .XCREF    XINC
  709. XINC    MACRO    LABEL
  710.     XINIT_IF_NECESSARY
  711. LABEL    =    LABEL+1
  712.     ENDM
  713.  
  714.     .XCREF    XSAVE,XPUSH,XPOP
  715.  
  716.  
  717.  
  718.  
  719.  
  720. XSAVE    MACRO    ENTRY,NUMBER
  721.     .XCREF    S?&ENTRY
  722. S?&ENTRY=    NUMBER
  723.     ENDM
  724.  
  725.  
  726.  
  727. XPUSH    MACRO
  728.     XINC    L?CNT
  729.     XINC    S?CNT
  730.     XSAVE    %S?CNT,%L?CNT
  731.     ENDM
  732.  
  733.  
  734.  
  735. XPOP    MACRO
  736. S?CNT    =    S?CNT-1
  737.     ENDM
  738.  
  739.     .XCREF    XLBL,XLBLS,XLBLI
  740.  
  741. XLBL    MACRO    NUMBER
  742.     .XCREF    L?&NUMBER
  743. L?&NUMBER:
  744.     ENDM
  745.  
  746.  
  747.  
  748. XLBLS    MACRO    NUMBER
  749.     XLBL    %S?&NUMBER
  750.     ENDM
  751.  
  752.  
  753. XLBLI    MACRO    NUMBER
  754.     XINIT_IF_NECESSARY
  755.     XLBL    %(S?&NUMBER&+1)
  756.     ENDM
  757.  
  758.     .XCREF    XJMP,XJMPS,XJMPI
  759.  
  760.  
  761. XJMP    MACRO    NUMBER,LONG
  762.     LJMP    L?&NUMBER, LONG
  763.     ENDM
  764.  
  765.  
  766. XJMPS    MACRO    NUMBER,LONG
  767.     XJMP    %S?&NUMBER,LONG
  768.     ENDM
  769.  
  770.  
  771. XJMPI    MACRO    NUMBER,LONG
  772.     XJMP    %(S?&NUMBER+1),LONG
  773.     ENDM
  774.  
  775.     .XCREF    XLP,XLPS
  776.  
  777.  
  778. XLP    MACRO    CONDITION,NUMBER,LONG
  779.     LLOOP    CONDITION,L?&NUMBER,LONG
  780.     ENDM
  781.  
  782.  
  783.  
  784.  
  785. XLPS    MACRO    CONDITION,NUMBER,LONG
  786.     XLP    CONDITION,%S?&NUMBER,LONG
  787.     ENDM
  788.  
  789.     .XCREF    XCJMP,XCJMPS,XCJMPI,XCXZJMP
  790.  
  791.  
  792. XCJMP    MACRO    CONDITION,NUMBER,LONG
  793.     LCJMP    CONDITION,L?&NUMBER,LONG
  794.     ENDM
  795.  
  796.  
  797. XCJMPS    MACRO    CONDITION,NUMBER,LONG
  798.     XCJMP    CONDITION,%S?&NUMBER,LONG
  799.     ENDM
  800.  
  801.  
  802. XCJMPI    MACRO    CONDITION,NUMBER,LONG
  803.     XINIT_IF_NECESSARY
  804.     XCJMP    CONDITION,%(S?&NUMBER+1),LONG
  805.     ENDM
  806.  
  807.  
  808. XCXZJMP    MACRO    NUMBER,LONG
  809.     LJCXZ    L?&NUMBER,LONG
  810.     ENDM
  811.  
  812.     .XCREF    XIFC,XANDIFC,COMPARE,XIF,XANDIF,XELSE,XENDIF
  813.  
  814.  
  815.  
  816.  
  817.  
  818. XIFC    MACRO    CONDITION,LONG
  819.     XPUSH
  820.     XCJMP    N&CONDITION,%L?CNT,LONG
  821.     ENDM
  822.  
  823.  
  824.  
  825. XANDIFC    MACRO    CONDITION,LONG
  826.     XCJMP    N&CONDITION,%L?CNT,LONG
  827.     ENDM
  828.  
  829.  
  830. COMPARE    MACRO    VAL1,VAL2
  831.     IFNB    <VAL2>
  832.     CMP    VAL1,VAL2
  833.     ENDIF
  834.     IFB    <VAL2>
  835.     AND    VAL1,VAL1
  836.     ENDIF
  837.     ENDM
  838.  
  839.  
  840.  
  841.  
  842.  
  843. XIF    MACRO    VAL1,CONDITION,VAL2,LONG
  844.     COMPARE    <VAL1>,<VAL2>
  845.     XIFC    CONDITION,LONG
  846.     ENDM
  847.  
  848.  
  849.  
  850.  
  851. XANDIF    MACRO    VAL1,CONDITION,VAL2,LONG
  852.     COMPARE    <VAL1>,<VAL2>
  853.     XANDIFC    CONDITION,LONG
  854.     ENDM
  855.  
  856.  
  857.  
  858.  
  859. XELSE    MACRO    LONG
  860.     XINC    L?CNT
  861.     XJMP    %L?CNT,LONG
  862.     XLBLS    %S?CNT
  863.     XSAVE    %S?CNT,%L?CNT
  864.     ENDM
  865.  
  866.  
  867.  
  868. XENDIF    MACRO
  869.     XLBLS    %S?CNT
  870.     XPOP
  871.     ENDM
  872.  
  873.     .XCREF    XLOOP,XENDLP,XBEGIN,XEND,XNEXT,XCNEXTC,XCNEXT,XCEXITC,XEXIT
  874.     .XCREF    XCEXIT,XWHILEC,XWHILE,XREPEAT,XUNTILC,XUNTIL,XFOR,XDEC
  875.  
  876.  
  877.  
  878.  
  879. XLOOP    MACRO
  880.     XPUSH
  881.     XLBL    %L?CNT
  882.     XINC    L?CNT
  883.     ENDM
  884.  
  885.  
  886.  
  887. XBEGIN    MACRO
  888.     XPUSH
  889.     XLBL    %L?CNT
  890.     XINC    L?CNT
  891.     ENDM
  892.  
  893.  
  894. XNEXT    MACRO    LONG
  895.     XJMPS    %S?CNT,LONG
  896.     ENDM
  897.  
  898.  
  899. XCNEXTC    MACRO    CONDITION,LONG
  900.     XCJMPS    CONDITION,%S?CNT,LONG
  901.     ENDM
  902.  
  903.  
  904.  
  905. XCNEXT    MACRO    VAL1,CONDITION,VAL2,LONG
  906.     COMPARE    <VAL1>,<VAL2>
  907.     XCNEXTC    CONDITION,LONG
  908.     ENDM
  909.  
  910.  
  911. XEXIT    MACRO    LONG
  912.     XJMPI    %S?CNT,LONG
  913.     ENDM
  914.  
  915.  
  916. XCEXITC    MACRO    CONDITION,LONG
  917.     XCJMPI    CONDITION,%S?CNT,LONG
  918.     ENDM
  919.  
  920.  
  921.  
  922. XCEXIT    MACRO    VAL1,CONDITION,VAL2,LONG
  923.     COMPARE    <VAL1>,<VAL2>
  924.     XCEXITC    CONDITION,LONG
  925.     ENDM
  926.  
  927.  
  928.  
  929. XENDLP    MACRO    LONG
  930.     XJMPS    %S?CNT,LONG
  931.     XLBLI    %S?CNT
  932.     XPOP
  933.     ENDM
  934.  
  935.  
  936.  
  937. XEND    MACRO
  938.     XLBLI    %S?CNT
  939.     XPOP
  940.     ENDM
  941.  
  942.  
  943.  
  944.  
  945.  
  946. XWHILEC    MACRO    CONDITION,LONG
  947.     XLOOP
  948.     XCEXITC    N&CONDITION,LONG
  949.     ENDM
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956. XWHILE    MACRO    VAL1,CONDITION,VAL2,LONG
  957.     XLOOP
  958.     XCEXIT    <VAL1>,N&CONDITION,<VAL2>,LONG
  959.     ENDM
  960.  
  961.  
  962.  
  963.  
  964. XREPEAT    MACRO
  965.     XLOOP
  966.     ENDM
  967.  
  968.  
  969.  
  970.  
  971. XUNTILC    MACRO    CONDITION
  972.     XCJMPS    N&CONDITION,%S?CNT
  973.     XLBLI    %S?CNT
  974.     XPOP
  975.     ENDM
  976.  
  977.  
  978.  
  979.  
  980.  
  981. XUNTIL    MACRO    VAL1,CONDITION,VAL2
  982.     COMPARE    <VAL1>,<VAL2>
  983.     XUNTILC    CONDITION
  984.     ENDM
  985.  
  986.  
  987.  
  988.  
  989.  
  990. XFOR    MACRO    NOZERO,LONG
  991.  
  992.  
  993.     IFB    <NOZERO>
  994.     XINIT_IF_NECESSARY
  995.     XCXZJMP    %(L?CNT+2),LONG
  996.     ENDIF
  997.     XLOOP
  998.     ENDM
  999.  
  1000.  
  1001.  
  1002.  
  1003. XDEC    MACRO    CONDITION,LONG
  1004.     XLPS    CONDITION,%S?CNT,LONG
  1005.     XLBLI    %S?CNT
  1006.     XPOP
  1007.     ENDM
  1008.  
  1009.     .XCREF    CALLSTR,FCBCALL,GETCALL
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016. CALLSTR    MACRO    ROUTINE,STRING
  1017.     MOV    DX,OFFSET STRING
  1018.     CALL    ROUTINE
  1019.     ENDM
  1020.  
  1021.  
  1022. GETCALL MACRO ROUTINE,STRING
  1023.  MOV BX,OFFSET STRING
  1024.  CALL ROUTINE
  1025.  ENDM
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031. FCBCALL    MACRO    ROUTINE,FCB,ERRORRTN
  1032.  
  1033.     MOV    DX,OFFSET FCB
  1034.     CALL    ROUTINE
  1035.     IFNB    <ERRORRTN>
  1036.     JZ    ERRORRTN
  1037.     ENDIF
  1038.     ENDM
  1039.  
  1040.     .CREF
  1041.     SET_MACRO_EXPANSION
  1042.  
  1043.  
  1044.